﻿#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>
int main()
{
	int n = 9;
	float* pFloat = (float*)&n;//强制转化为(float*)类型，解引用时认为指向对象为float类型的
	printf("n的值为：% d\n", n);
	printf("*pFloat的值为：% f\n", *pFloat);//0.000000
	//9
	//00000000 00000000 00000000 10000010
	//%f认为内存为float类型的数字
	*pFloat = 9.0f;
	printf("n的值为：% d\n", n);//
	//9.0
    // 1001
    //（-1）^0*1.001*2^3
    //S=0 
    //M=1.001
    //E=3
    //0 10000010 00100000000000000000000
	//01000001 00010000 00000000 00000000// //补码，正数，原、反、补相同
	//%d认为为整数的存储
	printf("*pFloat的值为：% f\n", *pFloat);
	return 0;
}
//#include <stdio.h>
//int main()
//{
//	float a= 9.5f;
//	//9.5
//	//1001.1
//	//(-1)^0*1.0011*2^3
//	//S=0 
//	//M=1.0011
//	//E=3
//	//0 10000010 00110000000000000000000
//	//01000001 00011000 00000000 00000000 //二进制
//	//  41       18       00       00     //十六进制
//}

//#include <stdio.h>
////X86环境
////⼩端字节序
//int main()
//{
//	int a[4] = { 1, 2, 3, 4 };
//	int* ptr1 = (int*)(&a + 1);//(&a + 1)指向指针末尾，ptr1[-1]可转化为*（ptr1-1）,为int*类型，-1回退四个字节，指向4
//	int* ptr2 = (int*)((int)a + 1);//(int)a将指针强制转化为int类型，地址转化为整数加1后(int*)强制转化为指针后相当为跳过1个字节
//	//在小端模式下，a的空间为为 01 00 00 00 02 00 00 00 ..... 加1后指针由01指向00，由于为(int*)类型解引用访问4个字节
//	//为00 00 00 02，由于小端模式，倒回去则原来为02 00 00 00
//	printf("%x, %x", ptr1[-1], *ptr2);
//	return 0;
//}

//#include <stdio.h> 
////X86环境下
////假设结构体的⼤⼩是20个字节
////程序输出的结果是啥？
//struct Test
//{
//	int Num;
//	char* pcName;
//	short sDate;
//	char cha[2];
//	short sBa[4];
//}*p = (struct Test*)0x100000;
//int main()
//{
//	printf("%p\n", p + 0x1);//为结构体指针，一次跳过20个字节
//	printf("%p\n", (unsigned long)p + 0x1);//强制将指针转化为unsigned long类型，会将地址转化为整数，加1类似于500+1
//	printf("%p\n", (unsigned int*)p + 0x1);//强制将结构体指针转化为整形指针，一次跳过4个字节
//	return 0;
//}
//#include <stdio.h>
//#include <windows.h>
//unsigned char i = 0;
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("%d hello world\n",i);
//		Sleep(1000);
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char a[1000];
//	int i;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	printf("%d", strlen(a));
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	char a = 128;
//	////  00000000 00000000 00000000 10000000  //-128的原码
//	////  01111111 11111111 11111111 01111111  //-128的反码
//	////  01111111 11111111 11111111 10000000  //-128的补码
//	////  10000000 //截断   //和char a=-128一样
//	printf("%u\n", a);
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	char a = -128;
////  10000000 00000000 00000000 10000000  //-128的原码
////  11111111 11111111 11111111 01111111  //-128的反码
////  11111111 11111111 11111111 10000000  //-128的补码
////  10000000 //截断
////  11111111 11111111 11111111 10000000  //a为有符号的，符号位为1，补1，为补码
//	printf("%u\n", a);//由于打印无符号的数，会将上方看作为无符号的，补码即是原码无符号位，全是数值位
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	char a = -1;
////  10000000 00000000 00000000 00000001  //  -1的原码
////	11111111 11111111 11111111 11111110  //  -1的反码
////	11111111 11111111 11111111 11111111  //  -1的补码
////  11111111 //由于char类型只存1字节（8bit）截断低字节位
////  11111111 11111111 11111111 11111111  //按%d,由于变量a为char类型，char为有符号的类型，得按符号位整形提升，为补码
////	10000000 00000000 00000000 00000001  //  原码（即为-1）
//	signed char b = -1;
////  和 char a=-1一样
//	unsigned char c = -1;
////  10000000 00000000 00000000 00000001  //  -1的原码
////	11111111 11111111 11111111 11111110  //  -1的反码
////	11111111 11111111 11111111 11111111  //  -1的补码
////  11111111 //由于char类型只存1字节（8bit）截断低字节位
////  00000000 00000000 00000000 11111111  //按%d,由于变量c为unsigned char类型，unsigned char为无有符号的类型，补0整形提升，为补码   
////  00000000 00000000 00000000 11111111  //为正数，原、反、补码相同（此时为255）
//	printf("a = %d, b = %d, c = %d", a, b, c);
//	return 0;
//}

//#include <stdio.h>
//int cheak_sys()
//{
//	int a = 1;
//	return *(char*)&a;
//}
//int main()
//{
//	int a = 1;
//	int ret = cheak_sys();
//	if (ret == 1)
//		printf("小端");
//	else
//		printf("大端");
//	return 0;
//}

/*#include <stdio.h>

int main()
{
	int a = 0x11223344;
	return 0;
}*/
